/**************************************************************************************************
**                                                                                               **
**  文件名称:  app_admin.c                                                                       **
**  版权所有:  CopyRight @ Xiamen Yaxon NetWork CO.LTD. 2017                                     **
**  文件描述:  APP层入口及管控模块                                                               **
**  ===========================================================================================  **
**  创建信息:  | 2017-6-30 | LEON | 创建本模块                                                   **
**  ===========================================================================================  **
**  修改信息:  单击此处添加....                                                                  **
**************************************************************************************************/
#include "app_include.h"
#include "app_admin.h"
#include "app_task_lcd.h"
#include "app_task_led.h"
#include "app_task_test.h"
#include "app_task_print.h"

/*************************************************************************************************/
//                           模块宏定义
/*************************************************************************************************/
#define START_TASK_PRIO      3                                                 /* 任务优先级 */
#define START_STK_SIZE       512                                               /* 任务堆栈大小 */

/*************************************************************************************************/
//                           静态变量定义
/*************************************************************************************************/
OS_TCB  StartTaskTCB;                                                          /* 任务控制块 */
CPU_STK START_TASK_STK[START_STK_SIZE];                                        /* 任务堆栈 */

/**************************************************************************************************
**  函数名称:  StartTask
**  功能描述:  系统启动任务的实际执行函数
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
static void StartTask(void *p_arg)
{
    OS_ERR err;
    
    p_arg = p_arg;

    CPU_SR_ALLOC();
    CPU_Init();
    
    #if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);                                              /* 初始化统计任务 */
    #endif
    
    #ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_IntDisMeasMaxCurReset();
    #endif

    #if OS_CFG_SCHED_ROUND_ROBIN_EN
    OSSchedRoundRobinCfg(DEF_ENABLED, 10, &err);                               /* 使能时间片轮转调度功能,设置时间片长度s */
    #endif
    
    OS_CRITICAL_ENTER();                                                       /* 首先保护临界资源 */
    CreateLEDTask();
    CreateLCDTask();
    CreateTestTask();
    CreatePrintTask();
    OS_CRITICAL_EXIT();                                                        /* 退出保护临界资源 */
    
    OS_TaskSuspend((OS_TCB*)&StartTaskTCB, &err);                              /* 挂起启动任务 */
}

/**************************************************************************************************
**  函数名称:  APPAdmin_Initiate
**  功能描述:  APP层管控模块初始化
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void APPAdmin_Initiate(void)
{
    OS_ERR err;

    CPU_SR_ALLOC();
    OSInit(&err);                                                              /* 初始化UCOSIII */

    OS_CRITICAL_ENTER();                                                       /* 进入临界区 */

    OSTaskCreate((OS_TCB    * )&StartTaskTCB,                                  /* 任务控制块 */
                 (CPU_CHAR  * )"StartTask",                                    /* 任务名字 */
                 (OS_TASK_PTR )StartTask,                                      /* 任务函数 */
                 (void      * )0,                                              /* 传递给任务函数的参数 */
                 (OS_PRIO     )START_TASK_PRIO,                                /* 任务优先级 */
                 (CPU_STK   * )&START_TASK_STK[0],                             /* 任务堆栈基地址 */
                 (CPU_STK_SIZE)START_STK_SIZE / 10,                            /* 任务堆栈深度限位 */
                 (CPU_STK_SIZE)START_STK_SIZE,                                 /* 任务堆栈大小 */
                 (OS_MSG_QTY  )0,                                              /* 任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 */
                 (OS_TICK     )0,                                              /* 当使能时间片轮转时的时间片长度，为0时为默认长度 */
                 (void      * )0,                                              /* 用户补充的存储区 */
                 (OS_OPT      )OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_SAVE_FP,
                 (OS_ERR    * )&err);                                          /* 存放该函数错误时的返回值 */

    OS_CRITICAL_EXIT();                                                        /* 退出临界区 */
    
    OSStart(&err);                                                             /* 开启UCOS */
    
    while(1) {
        ;
    } 
}



